home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / bootmenu2.lha / paz / Bootmenu.s
Encoding:
Text File  |  1993-04-18  |  20.8 KB  |  692 lines

  1. ; BootMenu by J Davis 09/1990
  2. ;
  3. ; version 1.0 - beta 05
  4. ;
  5. ; assembled using HiSoft DevPac v2
  6. ;
  7. ; a little program to allow choice of NTSC/PAL screen mode
  8. ; and expansion boards enabled/disabled at boot-time
  9. ;
  10. ; hangs around via both cool and coldcapture (see note 1)
  11. ;
  12. ; on each reboot puts up a menu allowing mode choice
  13. ;
  14. ; if there's no input in 10 secs, it defaults to the left most
  15. ; option ( PAL and boards ON respectively )
  16. ;
  17. ;
  18. ; note 1 : on machines with 1mb of chip, due to a slight oversight
  19. ;          in the 1.3/1.2 kickstart reset routine, EVERY reboot causes
  20. ;       a TOTAL system rebuild. This of course makes it hard to make
  21. ;          our code hang around.
  22. ;
  23. ;         Hence, we add a coldcapture handler that fixes the bug,
  24. ;          then run our menu routine of coolcapture
  25. ;
  26. ;          Hence our coldcapt routine also acts as an IMPROVED setpatch R,
  27. ;          in that two reboots in a row KILLS setpatch r, wheras ours,
  28. ;          hangs around and hence protects RAD: properly. Therefore 
  29. ;          DO NOT use SetPatch r and BootMenu at the same time!
  30. ;
  31. ;
  32. ; note 2 : if do_addemem is set to 1, this will build a version
  33. ;          that does an addmem of memory on the ronin 020 board
  34. ;          on the fly, due to the ronin mem not being dma-able we
  35. ;          have to set a low pri on the mem
  36.  
  37.         ; turn on debug info and turn off optimising
  38.         OPT    D+
  39.         OPT     O-
  40.  
  41. ;======================
  42.  
  43. do_addmem    equ    0    ; flag for whether we do an addmem
  44.                 ; for hurricane board as well
  45.  
  46. ;======================
  47.  
  48.  
  49.     IFNE    do_addmem=1
  50.         FORMAT 0-,1-,2-
  51.         LIST
  52.         ; building PBMC_BootMenu
  53.         NOLIST
  54.         output    PBMC_BootMenu
  55.     ELSEIF
  56.         FORMAT 0-,1-,2-
  57.         LIST
  58.         ; building normal BootMenu
  59.         NOLIST
  60.         output    bootmenu
  61.     ENDC    
  62.  
  63. chip_addr    equ    $40000    ; where we swap our chip data to/from
  64.  
  65. ; process structure offsets
  66.  
  67. pr_cli        equ    $0Ac    ; process cli flag offset
  68. pr_msgport    equ    $05c    ; process msgport offset
  69.  
  70. ; execbase structure offsets
  71.  
  72. coldcapture    equ    $02a
  73. coolcapture    equ    $02e
  74. sysstklower    equ    $03a
  75.         
  76. ; misc library functions
  77.  
  78. forbid        equ    -$084    ; offsets for various exec and int calls
  79. getmsg        equ    -$174    ; saves long includes and compile times
  80. replymsg    equ    -$17a
  81. waitport    equ    -$180
  82. findtask    equ    -$126
  83. autoreq        equ    -$15c
  84. openlib        equ    -$228
  85. closelib    equ    -$19e
  86.  
  87. output        equ    -$003c        
  88. write        equ    -$0030
  89.  
  90. openlibrary    equ    -$0228
  91. closelibrary    equ    -$019e
  92.  
  93. addmemlist     equ    -618    
  94.  
  95. ; hardware equates 
  96.  
  97. potgor        equ    $dff016
  98. potgo        equ    $dff034
  99.  
  100. intreq        equ    $dff09c
  101. intreqr        equ    $dff01e
  102.  
  103. ddfstart    equ    $dff092
  104. ddfstop        equ    $dff094
  105.  
  106. diwstart    equ    $dff08e
  107. diwstop        equ    $dff090
  108.  
  109. bpl1mod        equ    $dff108
  110.  
  111. bplcon1        equ    $dff102
  112. bplcon0        equ    $dff100
  113.  
  114. r_color0    equ    $0180
  115. r_color1    equ    $0182
  116.  
  117. r_bpl1pth    equ    $00e0
  118. r_bpl1ptl    equ    $00e2
  119.  
  120. cop1lch        equ    $dff080
  121. cop1lcl        equ    $dff082
  122. copjmp1        equ    $dff088
  123.  
  124. dmacon        equ    $dff096
  125.  
  126. agnusdetect    equ    $dff004
  127.  
  128. ;==============================================================
  129.  
  130. startup:    ; startup code - determine if run from wb/cli etc
  131.     
  132.         move.l    $4,a6
  133.         move.l    #0,a1
  134.         jsr    findtask(a6)        ; find ourselves
  135.  
  136.         move.l    d0,a4            ; save our process pointer
  137.  
  138.         move.l    pr_cli(a4),d0
  139.         bne    fromdos            ; was a DOS startup
  140.  
  141.         ; was started from WB
  142.  
  143. fromwb:        lea    pr_msgport(a4),a0
  144.         jsr    waitport(a6)        ; wait for startup msg
  145.         lea    pr_msgport(a4),a0
  146.         jsr    getmsg(a6)        ; get the wb msg
  147.  
  148.         move.l    d0,wbmsg        ; save pointer to our startup msg
  149.         move.l    #1,wb            ; flag we started from wb
  150.  
  151.         lea    intuiname,a1
  152.         move.l    #0,d0
  153.         move.l    $4,a6
  154.         jsr    openlib(a6)         ; open intuition lib
  155.  
  156.         move.l    d0,a6            ; save ibase
  157.         
  158.         move.l    #0,a0            ; window to display in
  159.         move.l    #bodyitext1,a1        ; body text
  160.         move.l    #gaditext,a2         ; postive text
  161.         move.l    #gaditext,a3          ; negative text
  162.         move.l    #0,d0            ; pflags
  163.         move.l    #0,d1            ; nflags
  164.         move.l    #370,d2            ; width
  165.         move.l    #80,d3            ; height
  166.         jsr    autoreq(a6)        ; request user confirmation
  167.  
  168.         move.l    a6,a1            ; close intuition lib
  169.         move.l    $4,a6
  170.         jsr    closelib(A6)
  171.  
  172.         bsr    install            ; install ourselves
  173.  
  174.         bra    exit
  175.  
  176. fromdos:    ; was run from dos - output message to stdout
  177.  
  178.         move.l    $4,a6
  179.         lea    dosname,a1
  180.         move.l    #$0,d0
  181.         jsr    openlibrary(a6)         ; open dos library
  182.         
  183.         move.l    d0,a6             ; save dos base
  184.         
  185.         jsr    output(a6)         ; get handle on stdout
  186.         
  187.         move.l    d0,d1             ; get file handle
  188.         move.l    #msgtxt,d2
  189.         move.l    #etext-msgtxt,d3
  190.         jsr    write(a6)         ; put up a message saying we're installed
  191.         
  192.         move.l    $4,a6
  193.         move.l    a6,a1
  194.         jsr    closelibrary(a6)     ; close dos
  195.  
  196.         bsr    install        
  197.  
  198. exit:        move.l    wb,d0
  199.         cmp.l    #0,d0            ; was this a CLI invocation
  200.         beq    exit_dos        ; DOS - just exit 
  201.  
  202.         ; workbench exit
  203.  
  204.         move.l    $4,a6
  205.         jsr    forbid(a6)        ; lock out everyone else
  206.  
  207.         move.l    wbmsg,a1
  208.         jsr    replymsg(a6)        ; reply to Wbstartup msg
  209.  
  210. exit_dos:    move.l    #0,d0            ; return with return code 0
  211.         rts            
  212.  
  213. ;=================================================
  214.         even
  215. wb:        dc.l    0            ; run mode flag 0=dos process 1=wbprocess
  216. wbmsg:        dc.l    0            ; where we save our workbench msg
  217.  
  218.         even
  219. intuiname:    dc.b    "intuition.library",0
  220.         
  221.         even
  222. dosname:    dc.b    "dos.library",0
  223.  
  224.         ; message we output for cli startup
  225.     IFNE    do_addmem=1
  226. msgtxt:        dc.b    27,"[33mBootMenu PBMC",27,"[0m, by J Davis 09/1990",10
  227.     ELSEIF
  228. msgtxt:        dc.b    27,"[33mBootMenu v1.0",27,"[0m, by J Davis 09/1990",10
  229.     ENDC
  230.         dc.b    "installed ok - menu will become active at next reboot",10,0
  231. etext:        dc.b    0
  232.  
  233.         even
  234.  
  235.         ; stuff for our autorequester for wb usage
  236. bodyitext1:    dc.b    2           ; front pen
  237.         dc.b    1           ; back pen
  238.         dc.b    0           ; draw mode
  239.         dc.w    40           ; leftedge
  240.         dc.w    6           ; topedge
  241.         dc.l    0           ; textattr = default
  242.         dc.l    bodytext1      ; actual text
  243.         dc.l    bodyitext2         ; next
  244.  
  245. bodyitext2:    dc.b    3           ; front pen
  246.         dc.b    0           ; back pen
  247.         dc.b    0           ; draw mode
  248.         dc.w    120           ; leftedge
  249.         dc.w    26           ; topedge
  250.         dc.l    0           ; textattr = default
  251.         dc.l    bodytext2      ; actual text
  252.         dc.l     bodyitext3    ; next
  253.  
  254. bodyitext3:    dc.b    3           ; front pen
  255.         dc.b    0           ; back pen
  256.         dc.b    0           ; draw mode
  257.         dc.w    20           ; leftedge
  258.         dc.w    36           ; topedge
  259.         dc.l    0           ; textattr = default
  260.         dc.l    bodytext3      ; actual text
  261.         dc.l    0         ; next
  262.  
  263. gaditext:    dc.b    0        ; front pen
  264.         dc.b    0        ; back pen
  265.         dc.b    0        ; draw mode
  266.         dc.w    4        ; leftedge
  267.         dc.w    4        ; topedge
  268.         dc.l    0        ; textattr = default
  269.         dc.l    gadtext        ; actual text
  270.         dc.l    0        ; next
  271.         
  272.         ; actual text for our requester
  273.  
  274.     IFNE    do_addmem=1
  275. bodytext1:    dc.b    "BootMenu PBMC, by J Davis 09/1990",0
  276.         ELSEIF
  277. bodytext1:    dc.b    "BootMenu v1.0, by J Davis 09/1990",0
  278.     ENDC
  279. bodytext2:    dc.b    "installed ok",0
  280. bodytext3:    dc.b    "menu will become active at next reboot",0
  281. gadtext:    dc.b    "Ok",0
  282.  
  283. ;=====================================================
  284.  
  285.         even
  286.  
  287. install:    ; this routine does the actual cold/coolcapture
  288.         ; setting 
  289.  
  290.         ; works out where we're going to install to
  291.         ; then copies handler code there and hooks vectors
  292.         
  293.         move.l    $4,a6
  294.         move.l    sysstklower(A6),a0            ; get pointer to base of sys-stack
  295.         move.l    a0,codetarget                ; save pointer to address
  296.  
  297.         move.l    a0,a1
  298.         add.l    #coldcapt-captstart,a1            ; point to coldcapt address
  299.         move.l    a1,coldcaptaddr                ; save address
  300.  
  301.         move.l    a0,a1
  302.         add      #coolcapt-captstart,a1            ; point to coolcapt addres
  303.         move.l    a1,coolcaptaddr                ; save address
  304.  
  305.         ; now stuff our code away on the bottom of the system stack
  306.  
  307.         lea    captstart(pc),a1            ; code to copy
  308.         move.l    codetarget,a2                 ; where to copy to
  309.         move.l    #endcapt-captstart,d0             ; amount to copy
  310. mloop:        move.b    (a1)+,(a2)+
  311.         dbf    d0,mloop
  312.  
  313.         ; now install a vector to the copied code in execbase.coldcapture
  314.         
  315.         move.l    $4,a6                       ; get execbase
  316.         move.l    coldcaptaddr,a0                ; address of our coldcap routine
  317.         move.l    a0,coldcapture(a6)             ; set coldcapture
  318.  
  319.         move.l    coolcaptaddr,a0                ; address of our coolcap routine
  320.         move.l    a0,coolcapture(a6)            ; set coolcapture to our code
  321.  
  322.         ; finally, recalc the execbase checksum
  323.         
  324.         lea    34(a6),a0                 ; start of checksummed area in execbase
  325.         move.w    #$16,d0                     ; number of checksummed words
  326.         move.w    #$0,d1                     ; clear counter
  327.     
  328. sum:        add.w    (A0)+,d1                 ; sum execbase and update checksum
  329.         dbf    d0,sum
  330.     
  331.         not.w    d1
  332.         move.w    d1,82(a6)                 ; set new execbase checksum
  333.  
  334.         ; all done
  335.         rts
  336.  
  337.         even
  338.         
  339. codetarget:    dc.l    0
  340. coolcaptaddr:    dc.l    0
  341. coldcaptaddr:    dc.l    0
  342.         
  343. ;==============================================================
  344. ;
  345. ; our capture routines
  346. ;
  347. ; since this is going to stick around, we need to copy
  348. ; it somewhere safe - like the SysStack area
  349. ;
  350. ; since we can't guarantee sys-stack will be in chip, we 
  351. ; swap our bitplane data and copper list to chip mem on the fly
  352. ; and then swap it back out ( in case rad: was using the bit where
  353. ; we put our screen ! )
  354.  
  355.         even
  356.  
  357. captstart:    
  358.  
  359. coldcapt:    ; this is our coldcapture routine - basically
  360.         ; fixes the rebuild problem that SETPATCH R tries
  361.         ; ( but fails ) to
  362.  
  363.         ; CAUTION!! This code is _specific to kickstart 1.x
  364.         ; DO NOT USE WITH KickStart 2.x!!!
  365.  
  366.         ; important - reinsert our code into execbase, as coldcapt
  367.         ; is cleared before it's called!! this is what setpatch r
  368.         ; fails to do (and hence why it's not reliable)!
  369.  
  370.         lea    coldcapt(pc),a0                ; on entry A6=execbase
  371.         move.l    a0,coldcapture(a6)            ; reset our vector in execbase - don't need to resum
  372.  
  373.         ; the following is a kludge to get around exec 34.x
  374.         ; insisting on doing a system rebuild if >512k chip
  375.         ; it is directly based on the rom code in ks1.2/1.3
  376.         
  377.         bchg    #1,$bfe001                ; toggle led on
  378.         
  379.         move.l    $fc0010,d0                ; get ks ver no.
  380.         cmp.l    $14(a6),d0                ; compare with execbase ver
  381.         bne.s    rebuild_all
  382.  
  383.         ; the following is the bit that's wrong with ks1.x
  384.         ; now fixed to work with 1mb chipmem
  385.         
  386.         move.l    $3e(a6),a3                ; get maxchipmem
  387.         cmpa.l    #$100000,a3                ; more than 1mb chip ?
  388.         bhi.s    rebuild_all
  389.         
  390.         add.l    #$1e,a5                    ; point A5 past the (incorrect) code we skip
  391.         jmp    (A5)                    ; carry on with rest of boot
  392.  
  393. rebuild_all:    jmp    $fc01ce                    ; jump to rom rebuild code
  394.  
  395. ;====================================================================
  396.  
  397.         even
  398.  
  399. coolcapt:    ; our coolcapture routine - actually does the menus etc
  400.  
  401.         movem.l    d0-d7/a0-a6,-(a7)            ; save everything
  402.  
  403.         bsr    swapmem                    ; first, copy our bitplane data and copper list to chip mem
  404.  
  405.         move.w    #$ffff,potgo                 ; set for button inputs on mouse
  406.         
  407.         ; finished setting up - ask whether to turn boards off
  408.         
  409.         move.l    #chip_addr+board_mode-chipdata_start,a1    ; address where bitplane data is copied to
  410.         bsr     doscreen                ; put up screen and wait for choice
  411.  
  412.         btst    #0,d0
  413.         beq.s    next                    ; left mouse=leave on so skip
  414.  
  415.         ; user requested expansion board disable - do it
  416.  
  417.         moveq.l    #$7,d1                    ; max no boards we fix = 8 
  418.  
  419. bchk:        move.w    $e80008,d0                ; get flag byte from board
  420.         not.w    d0                    ; invert
  421.         btst.l    #14,d0                    ; see if board supports shut_up
  422.         beq.s    shut_up                    ; bit=0 means board shuts up ok
  423.  
  424.         ; board doesn't support shut up, so 
  425.         ; config board to $200000 (only gap big enough for 8mb boards)
  426.         
  427.         move.w    #$0000,$e8004a              ; fake board out to $200000
  428.         move.w    #$2000,$e80048  
  429.         
  430.         bra.s    nboard                    ; carry on
  431.  
  432. shut_up:    move.b    #$ff,$e8004c                ; tell the board to shut up
  433.  
  434. nboard:        dbf    d1,bchk                    ; loop thru all boards
  435.  
  436.         ; now query for screen mode
  437. next:        ; see if this machine has the 1mb Agnus
  438.  
  439.         move.w    agnusdetect,d0
  440.         and.w    #$2000,d0
  441.         beq.s    no_8372                    ; doesn't have obese agnus - skip screen mode choice
  442.  
  443.         ; has the 1mb agnus, offer screen mode choice
  444.  
  445.         move.l    #chip_addr+scr_mode-chipdata_start,a1    ; address where bitplane data is copied to
  446.         bsr    doscreen                ; put up screen and wait for choice
  447.  
  448.         btst    #0,d0                    ; left mouse = PAL
  449.         beq.s    go_pal
  450.  
  451.         move.w    #$0000,$dff1dc                ; set NTSC mode on agnus
  452.         bra.s    no_8372
  453.  
  454. go_pal:        move.w    #$0020,$dff1dc                ; set PAL mode on agnus
  455.         
  456. no_8372:    bsr    swapmem                    ; finally restore chipmem    
  457.  
  458.     IFNE do_addmem=1 
  459.     
  460.         FORMAT    0-,1-,2-
  461.         LIST
  462.         ; adding special addmem code!
  463.         NOLIST
  464.         
  465.         ; Addmem the 32 bit mem on the Ronin 020 board
  466.         ; into the system
  467.         ;
  468.         ; we add 1mb, starting at $600000
  469.  
  470.         move.l    $4,a6        ; get execbase
  471.         move.l    #$100000,d0    ; amount of mem we're adding ( 1mb )
  472.         move.l    #$5,d1        ; attributes ( memf_fast | memf_public )
  473.         move.l    #-20,d2        ; pri of mem must be low so as to force HD to use chip!!!
  474.         move.l    #$600000,a0    ; where the mem starts ( 6 mb )
  475.         move.l    #0,a1        ; pointer to a name for this block 
  476.                     ; don't want one so pass NULL
  477.         jsr    addmemlist(a6)    ; do the deed !!!            
  478.  
  479.         ; you need to be careful after this to NOT run the 
  480.         ; ronin addmem prog - as otherwise you will get the 
  481.         ; same block of mem added TWICE ( can you say 'guru' ? :-)
  482.     ENDC
  483.  
  484.         movem.l    (A7)+,d0-d7/a0-a6            ; get back all regs
  485.         rts
  486.  
  487.  
  488. ; ===============================
  489. ; this routine swaps chipdata into/out of a block of chipmem
  490.  
  491. swapmem:    lea    chipdata_start(pc),a0            ; where to copy from
  492.         move.l    #chip_addr,a1                ; where we copy to
  493.         move.l    #chipdata_end-chipdata_start,d0        ; amount to copy
  494.  
  495. cm_loop:    move.b    (a0),d1                    ; we exchange data in and out
  496.         move.b    (a1),d2            
  497.         move.b    d2,(a0)+
  498.         move.b    d1,(a1)+
  499.         dbf    d0,cm_loop
  500.         
  501.         rts
  502.  
  503.  
  504. ;====================================
  505. ; this subroutine puts up the screen pointed to by a1
  506. ; and return d0=0 for left mouse and d0<>0 for right mouse
  507. ; also trashes d1
  508.  
  509. doscreen:    ; setup screen hardware
  510.  
  511.         move.w    #$1200,bplcon0                ; set for lores, 1 plane
  512.         move.w    #$0000,bplcon1
  513.         
  514.         move.w    #$0000,bpl1mod                ; modulo = 0
  515.         
  516.         move.w    #$0038,ddfstart                ; data fetch start
  517.         move.w    #$00d0,ddfstop                 ; data fetch stop
  518.         
  519.         move.w    #$7081,diwstart                ; display window start
  520.         move.w    #$89b0,diwstop                ; display window stop
  521.         
  522.         move.l    a1,d0                    ; setup up copper list bitplane pointers
  523.         move.w    d0,chip_addr+screen_l-chipdata_start    ; point cop1l load addr to right place
  524.         swap    d0
  525.         move.w    d0,chip_addr+screen_h-chipdata_start    ; point cop1h load addr to right place
  526.  
  527.         move.l    #chip_addr+ourcoplist-chipdata_start,cop1lch ; point copper at our copper list
  528.         
  529.         move.w    copjmp1,d0                ; force copper to our list
  530.         
  531.         move.w    #%1000000110000000,dmacon        ; enable bitplane and copper dma
  532.         
  533.         move.w    #10*50,d1                ; 10 secs worth of vblanks before timeout
  534.  
  535. waittof:    move.w    intreqr,d0
  536.         btst    #5,d0                    ; vblank int ?
  537.         beq.s    waittof                    ; wait until tof true
  538.     
  539.         move.w    #$0020,intreq                ; clear int
  540.         
  541.         btst    #6,$bfe001                ; left button down ?
  542.         beq.s    lmb
  543.         
  544.         btst    #10,potgor                ; right button down
  545.         beq.s    rmb
  546.  
  547.         subq.w    #$1,d1                    ; dec frame counter
  548.         cmp.w    #$0,d1                    ; time up ?
  549.         beq.s    lmb                    ; default to left mouse button
  550.         
  551.         bra.s    waittof        
  552.         
  553. lmb:        moveq    #0,d0
  554.         bra.s    _exit_1
  555.             
  556. rmb:        moveq    #1,d0
  557.  
  558. _exit_1:    ; debounce buttons to avoid 'fallthru' - wait for both buttons up
  559.  
  560.         btst    #10,potgor
  561.         beq    _exit_1                    ; wait for user to let go of rmb
  562.         
  563.         btst    #6,$bfe001
  564.         beq    _exit_1                    ; wait for user to let go of rmb
  565.  
  566.         ; now delay 15 vblanks to allow buttons to settle
  567.         
  568.         move.w    #15,d2
  569.         
  570. _1waittof:    move.w    intreqr,d1
  571.         btst    #5,d1                    ; vblank int ?
  572.         beq.s    _1waittof                ; wait until tof true
  573.     
  574.         move.w    #$0020,intreq                ; clear int
  575.  
  576.         subq.w    #1,d2                    ; dec delay counter
  577.         cmp.w    #$0,d2
  578.         bne    _1waittof
  579.         
  580.         move.w    #%0000000110000000,dmacon        ; disable bitplane and copper dma
  581.  
  582.         rts
  583.  
  584. ;=========================================
  585.  
  586.         ; message for people running VMK etc 
  587.  
  588.         dc.b    "  BootMenu v1.0 J Davis - this is NOT a virus!!!  "
  589.         
  590. ;=========================================
  591.  
  592.         even
  593.  
  594. chipdata_start:
  595.         
  596. ourcoplist:    ; the following copperlist runs our screen
  597.  
  598.         dc.w    r_bpl1pth
  599. screen_h    dc.w    0        ; set high bitplane address
  600.  
  601.         dc.w    r_bpl1ptl
  602. screen_l    dc.w    0        ; set low bitplane address
  603.  
  604.         dc.w    r_color0
  605.         dc.w    $0026        ; set background 
  606.  
  607.         dc.w    $6f01,$ff00    ; wait for top of our display
  608.         
  609.         dc.w    r_color1
  610.         dc.w    $0fff        ; set fg 
  611.  
  612.         dc.w    $7101,$ff00    ; wait til after top line
  613.  
  614.         dc.w    r_color1
  615.         dc.w    $0f08        ; set fg 
  616.  
  617.         dc.w    $7c01,$ff00    ; wait for next bit of text
  618.  
  619.         dc.w    r_color1
  620.         dc.w    $006c        ; set fg
  621.  
  622.         dc.w    $8801,$ff00    ; wait for bottom line
  623.  
  624.         dc.w    r_color1
  625.         dc.w    $0fff        ; set fg
  626.  
  627.         dc.w    $ffff,$fffe    ; wait for next TOF
  628.         
  629.         ; the following is the bit map for out first screen
  630.  
  631. board_mode:    dc.l    $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff
  632.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  633.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  634.         dc.l    $0000038C,$60000000,$0000000F,$E0000000,$00018000,$000FC000,$0000E000,$00000000,$00000000,$00000000
  635.         dc.l    $000006CE,$60000000,$00000006,$60000000,$00000000,$00066000,$00006000,$00000000,$71FDFC00,$00000000
  636.         dc.l    $0007EC6F,$67E00000,$00000006,$063DC3C7,$C3E383C7,$C00663C3,$CEC363E0,$00000000,$D8CCCC00,$00000000
  637.         dc.l    $07E00C6D,$E007E000,$00000007,$83666066,$66018666,$6007C660,$6766E600,$000000FD,$8CC0C0FC,$00000000
  638.         dc.l    $00000C6C,$E0000000,$00000006,$01C661E6,$63C18666,$60066661,$E66663C0,$0000FC01,$8CF0F000,$FC000000
  639.         dc.l    $0007E6CC,$67E00000,$00000006,$6367C666,$60618666,$60066666,$66066060,$00000001,$8CC0C000,$00000000
  640.         dc.l    $0000038C,$60000000,$0000000F,$E63603B6,$67C3C3C6,$600FC3C3,$BF03B7C0,$000000FC,$D8C0C0FC,$00000000
  641.         dc.l    $00000000,$00000000,$00000000,$000F0000,$00000000,$00000000,$00000000,$00000000,$71E1E000,$00000000
  642.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  643.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  644.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  645.         dc.l    $000007E0,$00004000,$00000006,$18C001E0,$07E00000,$7007C000,$00C00001,$E1E018C1,$E1E1E000,$00000000
  646.         dc.l    $00000330,$0000C000,$00000006,$19C00330,$03300000,$30036000,$00000003,$333031C3,$33333000,$00000000
  647.         dc.l    $00000331,$E1E1F331,$E3E33003,$30C00370,$03333000,$300331E3,$31C1F003,$733060C3,$33337000,$00000000
  648.         dc.l    $000003E3,$3330C3BB,$33333003,$30C003F0,$03E33000,$30033033,$30C30003,$F1F0C0C1,$F1F3F000,$00000000
  649.         dc.l    $00000333,$3330C35B,$F3333001,$E0C003B0,$03333003,$300330F3,$30C1E003,$B03180C0,$3033B000,$00000000
  650.         dc.l    $00000333,$3330D31B,$03333001,$E0C0C330,$0331E003,$30036331,$E0C03003,$306300C0,$60633000,$00000000
  651.         dc.l    $000007E1,$E1E06319,$E331D800,$C3F0C1E0,$07E0C001,$E007C1D8,$C1E3E001,$E1C603F1,$C1C1E000,$00000000
  652.         dc.l    $00000000,$00000000,$00000000,$00000000,$00038000,$00000000,$00000000,$00000000,$00000000,$00000000
  653.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  654.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  655.         dc.l    $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff
  656.         
  657.         ; the following is the bitmap for our second screen
  658.         
  659. scr_mode:    dc.l    $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff
  660.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  661.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  662.         dc.l    $000007E0,$C7800000,$00000000,$00001E00,$00000000,$00410007,$00000000,$0000018C,$FC787800,$00000000
  663.         dc.l    $00000331,$E3000000,$00000000,$00003300,$00000000,$00630003,$00000000,$000001CC,$B4CCCC00,$00000000
  664.         dc.l    $0003F331,$E303F000,$00000000,$0000381E,$761E1E3E,$00771E1B,$1E000000,$0000FDEC,$30E180FC,$00000000
  665.         dc.l    $03F003E3,$330003F0,$00000000,$00001C33,$3B333333,$007F3337,$33000000,$00FC01BC,$30718000,$FC000000
  666.         dc.l    $00000303,$F3100000,$00000000,$00000730,$333F3F33,$006B3333,$3F000000,$0000019C,$301D8000,$00000000
  667.         dc.l    $0003F306,$1B33F000,$00000000,$00003333,$30303033,$00633333,$30000000,$0000FD8C,$30CCCCFC,$00000000
  668.         dc.l    $00000786,$1FF00000,$00000000,$00001E1E,$781E1E33,$00631E1D,$9E000000,$0000018C,$78787800,$00000000
  669.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  670.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  671.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  672.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  673.         dc.l    $000007E0,$00004000,$00000006,$18C001E0,$07E00000,$7007C000,$00C00001,$E1E018C1,$E1E1E000,$00000000
  674.         dc.l    $00000330,$0000C000,$00000006,$19C00330,$03300000,$30036000,$00000003,$333031C3,$33333000,$00000000
  675.         dc.l    $00000331,$E1E1F331,$E3E33003,$30C00370,$03333000,$300331E3,$31C1F003,$733060C3,$33337000,$00000000
  676.         dc.l    $000003E3,$3330C3BB,$33333003,$30C003F0,$03E33000,$30033033,$30C30003,$F1F0C0C1,$F1F3F000,$00000000
  677.         dc.l    $00000333,$3330C35B,$F3333001,$E0C003B0,$03333003,$300330F3,$30C1E003,$B03180C0,$3033B000,$00000000
  678.         dc.l    $00000333,$3330D31B,$03333001,$E0C0C330,$0331E003,$30036331,$E0C03003,$306300C0,$60633000,$00000000
  679.         dc.l    $000007E1,$E1E06319,$E331D800,$C3F0C1E0,$07E0C001,$E007C1D8,$C1E3E001,$E1C603F1,$C1C1E000,$00000000
  680.         dc.l    $00000000,$00000000,$00000000,$00000000,$00038000,$00000000,$00000000,$00000000,$00000000,$00000000
  681.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  682.         dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
  683.         dc.l    $ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff,$ffffffff
  684.  
  685. chipdata_end:
  686.  
  687. endcapt:    
  688.  
  689.         END
  690.  
  691.